<?php defined('SYSPATH') or die('No direct script access.') ;
/**
 * Editor 编辑器基础类
 *
 * @author  Yellow.Chow <aultoale@gmail.com>
 * @version $Id: editor.php 198 2012-05-09 06:28:49Z yellow.chow $
 * @license http://www.gnu.org/licenses/gpl-3.0.html    GPL 3
 */
abstract class Editor
{
    /**
     * 默认编辑器类型
     */
    public static $default = 'KindEditor';

    /**
     * 记录已载入的 JS 文件
     *
     * @var array
     */
    protected static $_scripts = array();

    /**
     * 创建编辑器实例
     *
     * @param  string  $editor
     * @param  array   $config
     * @return Editor
     */
    public static function factory($editor = NULL, array $config = array())
    {
        if ( ! $editor)
        {
            $editor = Editor::$default;
        }

        $class = 'Editor_'.ucfirst($editor);

        if ( ! class_exists($class))
        {
            throw new Editor_Exception('不支持的编辑器类型 ":editor"',
                array(':editor' => $editor));
        }

        $config = array_merge((array) Config::get('editor.'.$editor), $config);

        $obj = new $class($config);
        if ( ! $obj instanceof Editor)
        {
            throw new Editor_Exception('无效的编辑器类型 ":editor"',
                array(':editor' => $editor));
        }

        return $obj;
    }

    /**
     * 加载 JS
     *
     * @param  string  $script
     * @param  bool    $once
     * @return string
     */
    public static function script($script, $once = TRUE)
    {
        return (isset(Editor::$_scripts[$script]) AND $once) ? '' : HTML::script($script);
    }

    /**
     * 编辑器名称 [name & id]
     *
     * @var string
     */
    protected $_name = 'content';

    /**
     * 显示宽度
     *
     * @var string
     */
    protected $_width = '99%';

    /**
     * 显示高度
     *
     * @var string
     */
    protected $_height = '300px';

    /**
     * 编辑器值
     *
     * @var string
     */
    protected $_value = '';

    /**
     * 风格样式
     *
     * @var string
     */
    protected $_style = '';

    /**
     * 是否允许上传
     *
     * @var bool
     */
    protected $_upload = FALSE;

    /**
     * 编辑器配置
     *
     * @var array
     */
    protected $_config = array();

    /**
     * 构造方法
     *
     * @param  array  $config
     */
    public function __construct(array $config = array())
    {
        // 配置分组
        $group = str_replace('editor_', '', strtolower(get_class($this)));

        // 初始化配置
        $this->_config = Config::get('editor.'.$group);

        if (is_array($config))
        {
            $this->set($config);
        }
    }

    /**
     * 设置配置参数
     *
     * @param  mixed  $key
     * @param  mixed  $value
     * @return Editor
     */
    public function set($key, $value = NULL)
    {
        $config = is_array($key) ? $key : array($key => $value);

        foreach ($config as $key => $value)
        {
            $method = 'set_'.$key;
            if (method_exists($this, $method))
            {
                $this->$method($value);
            }
            else
            {
                $this->_config[$key] = $value;
            }
        }

        return $this;
    }

    /**
     * 设置编辑器名称
     *
     * @param  string  $name
     * @return Editor
     */
    public function set_name($name)
    {
        $this->_name = (string) $name;

        return $this;
    }

    /**
     * 设置编辑器高度
     *
     * @param  string  $width
     * @return Editor
     */
    public function set_width($width)
    {
        $this->_width = $width;

        return $this;
    }

    /**
     * 设置编辑器高度
     *
     * @param  string  $height
     * @return Editor
     */
    public function set_height($height)
    {
        $this->_height = $height;

        return $this;
    }

    /**
     * 设置编辑器值
     *
     * @param  string  $value
     * @return Editor
     */
    public function set_value($value)
    {
        $this->_value = htmlspecialchars($value);

        return $this;
    }

    /**
     * 设置编辑器显示风格/样式
     *
     * @param  string  $style
     * @return Editor
     */
    public function set_style($style)
    {
        $this->_style = strtolower($style);

        return $this;
    }

    /**
     * 设置是否允许上传
     *
     * @param  bool  $upload
     * @return Editor
     */
    public function set_upload($upload)
    {
        $this->_upload = (bool) $upload;

        return $this;
    }

    /**
     * 魔术方法调用 render 方法
     *
     * @return string
     */
    public function __toString()
    {
        try
        {
            $html = $this->render();
        }
        catch (Exception $e)
        {
            $html = '<div style="color:red; padding:10px; margin:10px 0; border:1px solid #AAA; background:#FFFAFA;">编辑器加载失败：'.$e->getMessage().'</div>';
        }

        return $html;
    }

    /**
     * 输出 HTML 代码
     *
     * @return string
     */
    abstract public function render();

}